home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / lib / rcscripts / net.modules.d / wpa_supplicant < prev   
Text File  |  2006-04-25  |  7KB  |  245 lines

  1. # Copyright (c) 2004-2005 Gentoo Foundation
  2. # Distributed under the terms of the GNU General Public License v2
  3. # $Header$
  4.  
  5. # Contributed by Roy Marples (uberlord@gentoo.org)
  6.  
  7. # Fix any potential localisation problems
  8. # Note that LC_ALL trumps LC_anything_else according to locale(7)
  9. wpa_supplicant() {
  10.     LC_ALL=C /sbin/wpa_supplicant "$@"
  11. }
  12.  
  13. wpa_cli() {
  14.     LC_ALL=C /bin/wpa_cli "$@"
  15. }
  16.  
  17. # char* wpa_supplicant_provides(void)
  18. #
  19. # Returns a string to change module definition for starting up
  20. wpa_supplicant_provides() {
  21.     echo "wireless"
  22. }
  23.  
  24. # void wpa_supplicant_depend(void)
  25. #
  26. # Sets up the dependancies for the module
  27. wpa_supplicant_depend() {
  28.     after macchanger
  29.     before interface
  30. }
  31.  
  32. # bool wpa_supplicant_check_installed(void)
  33. #
  34. # Returns 1 if wpa_supplicant is installed, otherwise 0
  35. wpa_supplicant_check_installed() {
  36.     local report=${1:-false} installed=0
  37.     if [[ ! -x /sbin/wpa_supplicant ]]; then
  38.         installed=1
  39.         ${report} && eerror "For WPA support (wpa_supplicant) support, emerge net-wireless/wpa_supplicant"
  40.     fi
  41.     if [[ ! -e /proc/net/packet ]]; then
  42.         installed=1
  43.         ${report} && eerror "wpa_supplicant requires Packet Socket (CONFIG_PACKET=y) enabled in the kernel"
  44.     fi
  45.     return ${installed}
  46. }
  47.  
  48. # bool wpa_supplicant_check_depends(void)
  49. #
  50. # Checks to see if we have the needed functions
  51. wpa_supplicant_check_depends() {
  52.     local f
  53.  
  54.     for f in interface_exists interface_variable; do
  55.         [[ $( type -t ${f} ) == function ]] && continue
  56.         eerror "wpa_supplicant: missing required function ${f}\n"
  57.         return 1
  58.     done
  59.  
  60.     return 0
  61. }
  62.  
  63. # bool wpa_supplicant_check_extensions(char *interface)
  64. #
  65. # Checks to see if wireless extensions are enabled on the interface
  66. wpa_supplicant_check_extensions() {
  67.     grep -q "${1}: " /proc/net/wireless
  68. }
  69.  
  70. # char* wpa_supplicant_get_essid(char *interface)
  71. #
  72. # Gets the current ESSID of iface
  73. wpa_supplicant_get_essid() {
  74.     local i essid
  75.  
  76.     for (( i=0; i<5; i++ )); do
  77.         essid=$( wpa_cli -i${1} status 2>/dev/null | awk -F= '/^ssid=/ { print $2 }' )
  78.         if [[ -n ${essid} ]]; then
  79.             echo ${essid}
  80.             return 0
  81.         fi
  82.         sleep 1
  83.     done
  84.  
  85.     return 1
  86. }
  87.  
  88. # char* wpa_supplicant_get_ap_mac_address(char *interface)
  89. #
  90. # Returns the MAC address of the Access Point
  91. # the interface is connected to
  92. wpa_supplicant_get_ap_mac_address() {
  93.     wpa_cli -i${1} status 2>/dev/null | awk -F= '/^bssid=/ { print toupper($2) }'
  94. }
  95.  
  96. # bool wpa_supplicant_associated(char *interface)
  97. #
  98. # Returns 0 if we're associated correctly or 1 if not
  99. # Note that just because we are associated does not mean we are using the
  100. # correct encryption keys
  101. wpa_supplicant_associated() {
  102.     local -a status
  103.     eval status=( $( wpa_cli -i"$1" status | awk -F= '/^key_mgmt|^wpa_state|^EAP state/ { print "\""$2"\"" }' ) )
  104.  
  105.     case ${status[0]} in
  106.         "NONE"    )        [[ ${status[1]} == "ASSOCIATED" || ${status[1]} == "COMPLETED" ]] ;;
  107.         "IEEE 802.1X (no WPA)")    [[ ${status[2]} == "SUCCESS" ]] ;;
  108.         *)            [[ ${status[1]} == "COMPLETED" ]] ;;
  109.     esac
  110.  
  111.     return $?
  112. }
  113.  
  114. # void wpa_supplicant_kill(char *interface, bool report)
  115. #
  116. # Kills any existing wpa_supplicant process on the interface
  117. wpa_supplicant_kill() {
  118.     local iface=$1 report=${2:-false}
  119.     local pid=$( ps --no-headers -fC wpa_supplicant 2>/dev/null | awk '/-i'${iface}'/ { print $2 }' )
  120.  
  121.     if [[ -n ${pid} ]]; then
  122.         ${report} && ebegin "Stopping wpa_supplicant on ${iface}"
  123.         kill -s TERM ${pid}
  124.         ${report} && eend 0
  125.     fi
  126.  
  127.     # If wpa_supplicant exits uncleanly, we need to remove the stale dir
  128.     [[ -S /var/run/wpa_supplicant/${iface} ]] && rm -f /var/run/wpa_supplicant/${iface}
  129. }
  130.  
  131. # bool wpa_supplicant_associate(char *interface)
  132. #
  133. # Returns 0 if wpa_supplicant associates and authenticates to an AP
  134. # otherwise, 1
  135. wpa_supplicant_associate() {
  136.     local iface=${1} ifvar=$( interface_variable ${1} ) timeout i
  137.  
  138.     eval timeout=\"\$\{wpa_timeout_${ifvar}:-60\}\"
  139.     for (( i=0; i<${timeout}; i++ )); do
  140.         wpa_supplicant_associated ${iface} && break
  141.         sleep 1
  142.     done
  143.     if [[ ${i} == ${timeout} ]]; then
  144.         if ! wpa_supplicant_associated ${iface}; then
  145.             [[ ${background} != yes ]] && eend 1 "timed out"
  146.  
  147.             # We now need to kill the process
  148.             wpa_supplicant_kill ${iface}
  149.  
  150.             return 1
  151.         fi
  152.     fi
  153. }
  154.  
  155. # bool wpa_supplicant_pre_start(char *interface)
  156. #
  157. # Start wpa_supplicant on an interface and wait for association
  158. # Returns 0 (true) when successful, non-zero otherwise
  159. wpa_supplicant_pre_start() {
  160.     local iface=$1 opts ifvar cfgfile=/etc/wpa_supplicant.conf timeout
  161.  
  162.     # We only work on wirelesss interfaces
  163.     wpa_supplicant_check_extensions ${iface} || return 0
  164.  
  165.     # Kill off any existing wpa_supplicant on this interface
  166.     # This is so we can re-read the configuration file and clean any stale
  167.     # directories
  168.     wpa_supplicant_kill ${iface} true
  169.  
  170.         # If wireless-tools is installed, try and apply our user config
  171.     # This is needed for some drivers - such as hostap because they start
  172.     # the card in Master mode which causes problems with wpa_supplicant.
  173.     if [[ $( type -t iwconfig_defaults ) == "function" ]]; then
  174.         iwconfig_defaults ${iface}
  175.         iwconfig_user_config ${iface}
  176.     fi
  177.  
  178.     ebegin "Starting wpa_supplicant on ${iface}"
  179.  
  180.     if [[ ! -f ${cfgfile} ]]; then
  181.         eend 1 "configuration file ${cfgfile} not found!"
  182.         return 1
  183.     fi
  184.  
  185.     local ctrl_dir=$( sed -ne 's/[ \t]*#.*//g;s/[ \t]*$//g;s/^ctrl_interface=//p' ${cfgfile} )
  186.     if [[ ${ctrl_dir} != "/var/run/wpa_supplicant" ]]; then
  187.         eerror "${cfgfile} must set"
  188.         eerror "  ctrl_interface=/var/run/wpa_supplicant"
  189.         eend 1
  190.         return 1
  191.     fi
  192.  
  193.     ifvar=$( interface_variable ${iface} )
  194.     eval opts=\" \$\{wpa_supplicant_${ifvar}\}\"
  195.     [[ ${opts} != *' -D'* ]] && ewarn "wpa_supplicant_${ifvar} does not define a driver"
  196.     
  197.     # Some drivers require the interface to be up
  198.     interface_up ${iface}
  199.  
  200.     if ! wpa_supplicant ${opts} -B -c/etc/wpa_supplicant.conf -i${iface} ; then
  201.         eend 1
  202.         return 1
  203.     fi
  204.  
  205.     if ! wpa_cli -i${iface} status &>/dev/null ; then
  206.         eend 1 "wpa_supplicant has exited unexpectedly"
  207.         return 1
  208.     fi
  209.  
  210.     eindent
  211.     veinfo "Waiting for association"
  212.     eend 0
  213.  
  214.     wpa_supplicant_associate ${iface} || return 1
  215.  
  216.     # Set ESSID for essidnet and report
  217.     ESSID=$( wpa_supplicant_get_essid ${iface} )
  218.     local -a status
  219.     eval status=( $( wpa_cli -i"${iface}" status | awk -F= '/^bssid|^pairwise_cipher|^key_mgmt/ { print "\""$2"\"" }' ) )
  220.     local mac=$( echo ${status[0]} | tr '[:lower:]' '[:upper:]' )
  221.     einfo "${iface} connected to \"${ESSID//\\\\/\\\\}\" at ${mac}"
  222.  
  223.     if [[ ${status[2]} == NONE ]]; then
  224.         if [[ ${status[1]} == NONE ]]; then
  225.             ewarn "not using any encryption"
  226.         else
  227.             veinfo "using ${status[1]}"
  228.         fi
  229.     else
  230.         veinfo "using ${status[2]}/${status[1]}"
  231.     fi
  232.     eoutdent
  233.  
  234.     return 0
  235. }
  236.  
  237. # bool wpa_supplicant_post_stop(char *iface)
  238. #
  239. # Stops wpa_supplicant on an interface
  240. # Returns 0 (true) when successful, non-zero otherwise
  241. wpa_supplicant_post_stop() {
  242.     wpa_supplicant_kill $1 true
  243.     return 0
  244. }
  245.